
package Attributes;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

public class Person extends Observable implements Comparable, Observer {

    /*
     * clase Person
     *
     * Se puede construir con o sin atributos inicialmente.
     *
     * Se le pueden agregar atributos luego de su construccion.
     *
     * Tiene siempre calculado el valor MAUT, para no calcularlo cada vez que se
     * lo necesite.
     *
     * Es Observer de sus Attributes, si uno de estos cambia, su valor MAUT se
     * actualiza automaticamente.
     *
     * Se puede acceder a sus atributos por orden o por nombre.
     *
     * Es Observable, para facilitar actualizaciones en la interfaz grafica.
     *
     */
    
    private double MAUTvalue;
    private ArrayList<Attribute> attributes;

    public Person() {
        MAUTvalue = 0;
        attributes = new ArrayList<Attribute>();
    }

    public Person(ArrayList<Attribute> attributes) {
        /*
         * Al crear la persona se calcula el valor correspondiente de su valor
         * MAUT
         */
        this.attributes = attributes;
        for (Attribute a : attributes) {
            a.addObserver(this);
        }
        calculateMAUT();
    }
    
    public void addAttribute(Attribute attribute) {
        MAUTvalue += attribute.getValue();
        attributes.add(attribute);
        attribute.addObserver(this);
    }

    public int getNoAttributes() {
        return attributes.size();
    }

    public Attribute getAttribute(int i) {
        return attributes.get(i);
    }

    public Attribute getAttribute(String name) {
        for (Attribute a : attributes) {
            if (a.getName().equals(name)) {
                return a;
            }
        }
        return null;
    }

    public double getMAUTValue() {
        return MAUTvalue;
    }

    @Override
    public int compareTo(Object o) {
        Person p = (Person) o;
        if (MAUTvalue > p.getMAUTValue()) {
            return 1;
        } else if (MAUTvalue == p.getMAUTValue()) {
            return 0;
        } else {
            return -1;
        }
    }

    public void calculateMAUT() {
        MAUTvalue = 0;
        boolean excluyente = false;
        for (Attribute a : attributes) {
            if (a.isExcluyente()) {
                excluyente = true;
            }
            MAUTvalue += a.getValue();
        }
        if (excluyente) {
            MAUTvalue = 0;
        }
    }

    @Override
    public void update(Observable o, Object arg) {
        calculateMAUT();
        setChanged();
        notifyObservers();
    }
}
